package app.vista;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
import beans.PlatoVO;
import beans.ProductoVO;
import app.Administracion;
import app.Defines;
import app.Sistema;

public class MenuPrincipalView extends JFrame 
{
	private static final long serialVersionUID = 1L;
	
	public static String aplicacion = "Cocina Internacional 2012";
	public static MenuPrincipalView instancia;
	private Sistema sis;
	private JMenuBar jMenuBar1;
	protected static JScrollPane  jps;
	
	private JMenu producto;
	private JMenuItem altaProducto;
	private JMenuItem bajaProducto;
	private JMenuItem modifProducto;

	private JMenu plato;
	private JMenuItem altaPlato;
	private JMenuItem bajaPlato;
	private JMenuItem modifPlato;
	
	private ImagePanel jDesktopPane1;
	private JLabel labelB;
	
	
	JTabbedPane tabbedPane = new JTabbedPane();
	private JTable tableProductos;
	private DefaultTableModel tabledfProductos;

	private JTable tablePlatos;
	private DefaultTableModel tabledfPlato;
	
	
	private MenuPrincipalView(Sistema sis) 
	{
		super(aplicacion);
		this.sis = sis;
		initGUI();
		refreshTables();
		System.out.println("CREA UNA NUEVA INSTANCIA DE LA VENTANA");
	}

	public static MenuPrincipalView getInstancia(Sistema sis) 
	{
		if (instancia == null) 
		{
			instancia = new MenuPrincipalView(sis);
		}
		return instancia;
	}

	private void initGUI() 
	{
		try 
		{
			setSize(1200, 700);
			setLocation(750, 150);
			setResizable(false);
			setVisible(true);
			String path = "fondo.jpg";
	        BufferedImage image = ImageIO.read(new File(path));
	        this.jDesktopPane1 = new ImagePanel(image);
			BorderLayout jDesktopPane1Layout = new BorderLayout();
			this.jDesktopPane1.setLayout(jDesktopPane1Layout);
			getContentPane().add(this.jDesktopPane1, "Center");
			this.labelB = new JLabel();
			this.jDesktopPane1.add(this.labelB, "South");
			this.labelB.setText("Restaurante - Alles Gute Wurst");
			this.labelB.setHorizontalAlignment(0);
			this.labelB.setOpaque(true);
			this.labelB.setFont(new Font("Segoe UI", 0, 14));

			this.jMenuBar1 = new JMenuBar();
			setJMenuBar(this.jMenuBar1);
			this.producto = new JMenu();
			this.jMenuBar1.add(this.producto);
			this.producto.setText("Productos");
			
			this.altaProducto = new JMenuItem();
			this.producto.add(this.altaProducto);
			this.altaProducto.setText("Alta Producto");
			this.altaProducto.setBounds(86, 0, 304, 23);
			this.altaProducto.addActionListener(new ActionListener() 
			{
				public void actionPerformed(ActionEvent evt) 
				{
					MenuPrincipalView.this.jDesktopPane1.add(ProductoGUI.getInstancia(Defines.altaProducto, getAdministracion(), instancia));
				}
			});
			this.bajaProducto = new JMenuItem();
			this.producto.add(this.bajaProducto);
			this.bajaProducto.setText("Baja Producto");
			this.bajaProducto.setBounds(86, 0, 304, 23);
			this.bajaProducto.addActionListener(new ActionListener() 
			{
				public void actionPerformed(ActionEvent evt) 
				{
					MenuPrincipalView.this.jDesktopPane1.add(ProductoGUI.getInstancia(Defines.bajaProducto, getAdministracion(),instancia));
				}
			});
			this.modifProducto = new JMenuItem();
			this.producto.add(this.modifProducto);
			this.modifProducto.setText("Modificacion Producto");
			this.modifProducto.setBounds(86, 0, 304, 23);
			this.modifProducto.addActionListener(new ActionListener() 
			{
				public void actionPerformed(ActionEvent evt) 
				{
					MenuPrincipalView.this.jDesktopPane1.add(ProductoGUI.getInstancia(Defines.modifProducto , getAdministracion(),instancia));
				}
			});

			this.plato = new JMenu();
			this.jMenuBar1.add(this.plato);
			this.plato.setText("Platos");
			
			this.altaPlato = new JMenuItem();
			this.plato.add(this.altaPlato);
			this.altaPlato.setText("Alta Plato");
			this.altaPlato.setBounds(86, 0, 304, 23);
			this.altaPlato.addActionListener(new ActionListener() 
			{
				public void actionPerformed(ActionEvent evt) 
				{
					MenuPrincipalView.this.jDesktopPane1.add(PlatoGUI.getInstancia(Defines.altaPlato, getSistema(), instancia));
				}
			});
			this.bajaPlato = new JMenuItem();
			this.plato.add(this.bajaPlato);
			this.bajaPlato.setText("Baja Plato");
			this.bajaPlato.setBounds(86, 0, 304, 23);
			this.bajaPlato.addActionListener(new ActionListener() 
			{
				public void actionPerformed(ActionEvent evt) 
				{
					MenuPrincipalView.this.jDesktopPane1.add(PlatoGUI.getInstancia(Defines.bajaPlato, getSistema(),instancia));
				}
			});
			this.modifPlato = new JMenuItem();
			this.plato.add(this.modifPlato);
			this.modifPlato.setText("Modificacion Plato");
			this.modifPlato.setBounds(86, 0, 304, 23);
			this.modifPlato.addActionListener(new ActionListener() 
			{
				public void actionPerformed(ActionEvent evt) 
				{
					MenuPrincipalView.this.jDesktopPane1.add(PlatoGUI.getInstancia(Defines.modifPlato , getSistema(),instancia));
				}
			});
			
			createTabbedTables();	
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public Sistema getSistema() 
	{
		return this.sis;
	}

	public Administracion getAdministracion() 
	{
		return this.sis.getAdministracion();
	}
	
	private void createTabbedTables() 
	{
		GridLayout grid = new GridLayout();
		this.getContentPane().setLayout(grid);

	    tabledfProductos = new DefaultTableModel();
		tableProductos = new JTable(tabledfProductos);
		tableProductos.setAutoCreateRowSorter(true);
		tableProductos.setEnabled(false);
		tableProductos.setShowVerticalLines(true);	
		tableProductos.setShowHorizontalLines(false);
		tableProductos.setFillsViewportHeight(true);
		tableProductos.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
		tableProductos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);		
		tabbedPane.addTab("Productos", new JScrollPane(tableProductos));
		this.getContentPane().add(tabbedPane);

		tabledfPlato = new DefaultTableModel();
		tablePlatos = new JTable(tabledfPlato);
		tablePlatos.setAutoCreateRowSorter(true);
		tablePlatos.setEnabled(false);
		tablePlatos.setShowVerticalLines(true);	
		tablePlatos.setShowHorizontalLines(false);
		tablePlatos.setFillsViewportHeight(true);
		tablePlatos.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
		tablePlatos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);		
		tabbedPane.addTab("Platos", new JScrollPane(tablePlatos));
		this.getContentPane().add(tabbedPane);
		
	}
	
	public void refreshTables() 
	{
		refreshtableProductos();
		refreshtablePlatos();
	}
	
	private void refreshtableProductos() 
	{
		Vector <String> tableColumn = new Vector<String>();
		Vector <Vector <Object>> tableData = new Vector<Vector<Object>>(); 
		Vector <Object> vec;
		
		tableColumn.add("nombre");
		tableColumn.add("descripcion");
		tableColumn.add("precioVenta");
			
		List<ProductoVO> productos = Administracion.getInstancia().getProductosVO();
		if(productos != null)
		{
			for (int i = 0; i < productos.size(); i++) 
			{
				vec = new Vector<Object>();
				vec.add(productos.get(i).getNombre());
				vec.add(productos.get(i).getDescripcion());
				vec.add(String.valueOf(productos.get(i).getPrecioVenta()));
				tableData.add(vec);
			}
		}
		
		tabledfProductos.setDataVector(tableData, tableColumn);
		tableProductos.validate();
		tableProductos.repaint();		
	}

	private void refreshtablePlatos() 
	{
		Vector <String> tableColumn = new Vector<String>();
		Vector <Vector <Object>> tableData = new Vector<Vector<Object>>(); 
		Vector <Object> vec;
		
		tableColumn.add("nombre");
		tableColumn.add("precio");
		tableColumn.add("rubro");
		tableColumn.add("comision_extra");
		
		ArrayList<PlatoVO> plato = Sistema.getInstancia().getPlatos();
		for (int j = 0 ; j < plato.size() ; j++)
		{
			vec = new Vector<Object>();
			vec.add(plato.get(j).getNombre());
			vec.add(String.valueOf(plato.get(j).getPrecio()));
			vec.add(plato.get(j).getRubro());
			vec.add(String.valueOf(plato.get(j).getComision_extra()));
			tableData.add(vec);
		}
		
		tabledfPlato.setDataVector(tableData, tableColumn);
		tablePlatos.validate();
		tablePlatos.repaint();		
	}
}
